#include "Desplazamiento.h"

Desplazamiento::Desplazamiento():semilla(SEMILLA){}
size_t Desplazamiento::pos_fila(size_t& idx){
	size_t fila=0;
	bool encontrado=false;
	while (!(encontrado=((idx-fila)%4==0)))
		++fila;
	return fila;
}
size_t Desplazamiento::obtner_columna_fila1_o_fila2(size_t& idx,size_t& fila){
	size_t j=0;
	if ((PRIMER_NIVEL_INF+fila<= idx)&&(idx<=PRIMER_NIVEL_SUP+fila)) j=3;
	if ((TERCER_NIVEL_INF+fila<= idx)&&(idx<=TERCER_NIVEL_SUP+fila)) j=2;
	if ((CUARTO_NIVEL_INF+fila<= idx)&&(idx<=CUARTO_NIVEL_SUP+fila)) j=1;
	if ((SEGUNDO_NIVEL_INF+fila<= idx)&&(idx<=SEGUNDO_NIVEL_SUP+fila)) j=0;
	return j;
}
size_t Desplazamiento::obtner_columna_fila0_o_fila3(size_t& idx,size_t& fila){
	size_t j=0;
	if (((PRIMER_NIVEL_INF+fila<= idx)&&(idx<=PRIMER_NIVEL_SUP+fila)&&(fila==0)) ||
		((fila==3)&&(TERCER_NIVEL_INF+fila<= idx)&&(idx<=TERCER_NIVEL_SUP+fila)))
			j=3;
	if (((fila==0)&&(CUARTO_NIVEL_INF<= idx)&&(idx<=CUARTO_NIVEL_SUP))||
		((fila==3)&&(PRIMER_NIVEL_INF+fila<= idx)&&(idx<=PRIMER_NIVEL_SUP+fila)))
			j=2;
	if (((fila==0)&&(SEGUNDO_NIVEL_INF<= idx)&&(idx<=SEGUNDO_NIVEL_SUP))||
		((fila==3)&&(CUARTO_NIVEL_INF+fila<= idx)&&(idx<=CUARTO_NIVEL_SUP+fila)))
			j=1;
	if (((fila==0)&&(TERCER_NIVEL_INF<= idx)&&(idx<=TERCER_NIVEL_SUP))||
		((fila==3)&&(SEGUNDO_NIVEL_INF+fila<= idx)&&(idx<=SEGUNDO_NIVEL_SUP+fila)))
			j=0;
	return j;
}
size_t Desplazamiento::pos_columna(size_t& idx,size_t& fila){
	return ((fila==0)||(fila==3))?
			(obtner_columna_fila0_o_fila3(idx,fila)):
			(obtner_columna_fila1_o_fila2(idx,fila));
}
size_t& Desplazamiento::obtener_valor(size_t& idx){
	size_t i=pos_fila(idx);
	size_t j=pos_columna(idx,i);
	actual_bit_value=5*i+j+semilla;
	if (i==3)
		++actual_bit_value;
	return actual_bit_value;
}
size_t& Desplazamiento::operator[](size_t& idx){
	return obtener_valor(idx);
}
